#pragma once

#include "data.hpp"
#include "util.hpp"
#include "config.hpp"
#include <string>
#include <time.h>
#include <unistd.h>

extern cloud::DataManager *_data;
using namespace std;
namespace cloud
{
    class HotManager
    {
    private:
        string _back_dir;
        string _pack_dir;
        string _pack_suffix;
        int _hot_time;
    public:
        bool HotJudge(const string &filename)
        {
            Util::FileUtil fu(filename);
            time_t last_atime = fu.LastAtime();
            time_t cur_time = time(nullptr);
            if (cur_time - last_atime > _hot_time)
            {
                return true;
            }
            return false;
        }
        HotManager()
        {
            Config *config = Config::GetInstance();
            _back_dir = config->GetBackDir();
            _pack_dir = config->GetPackDir();
            _pack_suffix = config->GetPackFileSuffix();
            _hot_time = config->GetHoTime();
            Util::FileUtil tem1(_back_dir);
            Util::FileUtil tem2(_pack_dir);
            tem1.CreateDirctory();
            tem2.CreateDirctory();
        }
        bool RunModule()
        {
            
            while (true)
            {
                Util::FileUtil fu(_back_dir);
                vector<string> arr;
                fu.ScanDirectory(&arr);

                for (auto &a : arr)
                {
                    // 如果是热点文件就跳过
                    if (HotJudge(a) == false)
                    {
                        continue;
                    }
                    // 获取文件备份信息，如果没有创建文件的备份信息
                    BackupInfo bi;
                    if (_data->GetOneByRealPath(a, &bi) == false)
                    {
                        bi.NewBackupInfo(a);
                    }
                    // 文件压缩处理
                    Util::FileUtil tem(a);
                    tem.Compress(bi.pack_path);
                    tem.Remove();
                    bi.pack_flag = true;
                    _data->Update(bi);
                }
                usleep(1000);
            }
            return true;
        }
    };
}